#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <getopt.h>

int main(int argc, char *argv[]) {
    int opt;
    int n = 0;

    // 解析命令行参数 -t n
    while ((opt = getopt(argc, argv, "t:")) != -1) {
        switch (opt) {
            case 't':
                n = atoi(optarg);
                if (n < 1 || n > 3) {
                    fprintf(stderr, "n must be 1, 2, or 3\n");
                    exit(1);
                }
                break;
            default:
                fprintf(stderr, "Usage: %s -t n cmd file\n", argv[0]);
                exit(1);
        }
    }

    // 检查是否提供了命令和文件
    if (optind >= argc - 1) {
        fprintf(stderr, "Missing command or file\n");
        exit(1);
    }

    // 获取命令和文件
    char *cmd = argv[optind];
    char *file = argv[optind + 1];

    // 根据n选择重定向方式
    if (n == 1) {
        // 方式1: close然后open
        close(STDOUT_FILENO);
        int fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
        if (fd != STDOUT_FILENO) {
            perror("open did not return 1");
            exit(1);
        }
    } else if (n == 2) {
        // 方式2: open、close、dup、close
        int fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
        if (fd < 0) {
            perror("open");
            exit(1);
        }
        close(STDOUT_FILENO);
        if (dup(fd) != STDOUT_FILENO) {
            perror("dup did not return 1");
            exit(1);
        }
        close(fd);
    } else if (n == 3) {
        // 方式3: 使用dup2
        int fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
        if (fd < 0) {
            perror("open");
            exit(1);
        }
        if (dup2(fd, STDOUT_FILENO) < 0) {
            perror("dup2");
            exit(1);
        }
        close(fd);
    } else {
        fprintf(stderr, "Please specify a redirection method with -t (1, 2, or 3)\n");
        exit(1);
    }

    // 执行命令
    execlp(cmd, cmd, NULL);
    perror("execlp");
    exit(1);
}